#ifndef __UTILS_H__
#define __UTILS_H__

// 头文件内容
#include <stdio.h>
#include <time.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <pthread.h>
#include <sys/stat.h>
#include <dirent.h>
#define GREEN "\x1b[32m" // 绿色
#define RED "\x1b[31m"   // 红色
#define YELLOW "\x1b[33m" // 黄色
#define RESET "\x1b[0m"  // 重置颜色


// 显示时间
void show_time(char *time_arr);

// 文件打开安全判断
#define FOPEN_ERR(FP)           \
    if (NULL == FP)             \
    {                           \
        perror("fopen error:"); \
        return -1;              \
    }

#define OPEN_ERR(FD)                                                    \
    if (EOF == FD)                                                      \
    {                                                                   \
        printf("文件:%s 函数:%s 行:%d\n" __FILE__, __func__, __LINE__); \
        perror("open error:");                                          \
        return -1;                                                      \
    }

// 目录打开安全判断
#define OPEN_DIR_ERR(DIR)       \
    if (NULL == DIR)            \
    {                           \
        perror("fopen error:"); \
        return -1;              \
    }

// 终端参数输入安全判断
#define ARGV_IF(argc, num)               \
    if (num != argc)                     \
    {                                    \
        printf("格式: IP地址 端口号\n"); \
        return -1;                       \
    }

// 定义宏 报错日志文件
#define LOG_FILE "log/error.log"

// 错误输出宏定义，写入日志文件并显示在终端
#define ERRLOG(msg)                                                                                                           \
    do                                                                                                                        \
    {                                                                                                                         \
        time_t now = time(NULL);                                                                                              \
        struct tm *loc_time = localtime(&now);                                                                                \
        char timestr[128];                                                                                                    \
        strftime(timestr, sizeof(timestr), "现在是北京时间:%Y年%m月%d日 %H时%M分%S秒\n", loc_time);                           \
        timestr[strlen(timestr) - 1] = '\0'; /* 去掉末尾的换行符 */                                                   \
        FILE *log_file = fopen(LOG_FILE, "a");                                                                                \
        if (log_file)                                                                                                         \
        {                                                                                                                     \
            fprintf(log_file, "[%s] 错误: %s\t文件: %s\t函数: %s\t行号: %d\n\n", timestr, msg, __FILE__, __func__, __LINE__); \
            fclose(log_file);                                                                                                 \
        }                                                                                                                     \
        else                                                                                                                  \
        {                                                                                                                     \
            fprintf(stderr, "错误: 无法打开日志文件: %s\n", LOG_FILE);                                                        \
        } /* 输出到标准错误流 */                                                                                      \
        fprintf(stderr, "[%s] 错误: %s\t文件: %s\t函数: %s\t行号: %d\n", timestr, msg, __FILE__, __func__, __LINE__);         \
    } while (0)



#endif // __UTILS_H__
